home *** CD-ROM | disk | FTP | other *** search
/ Tech Win 1999 February / TECH Win 02-1999 Disc A.iso / ols / lzh / tcl211.lzh / DLLSRC.lzh / utl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-27  |  7.0 KB  |  343 lines

  1. /*-------------------------------------------
  2.  UTL.C
  3.   その他の関数
  4.   KAZUBON 1997
  5. ---------------------------------------------*/
  6.  
  7. #include <windows.h>
  8. void WriteDebug(LPSTR s);
  9.  
  10. extern HANDLE hmod;
  11.  
  12. /*------------------------------------------------
  13.  指定された名前のフォントがあるか調べる
  14. --------------------------------------------------*/
  15. BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  16.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM fontname)
  17. {
  18.     if(strcmp((LPSTR)fontname, pelf->elfLogFont.lfFaceName) == 0)
  19.         return FALSE;
  20.     return TRUE;
  21. }
  22.  
  23. /*------------------------------------------------
  24.  API:ポイントサイズからフォントを作成
  25. --------------------------------------------------*/
  26. HFONT CreateMyFont(char* fontname, int fontsize,
  27.     LONG weight, LONG italic)
  28. {
  29.     LOGFONT lf;
  30.     POINT pt;
  31.     HDC hdc;
  32.     
  33.     memset(&lf, 0, sizeof(LOGFONT));
  34.  
  35.     hdc = GetDC(NULL);
  36.     
  37.     // 文字セットを決める
  38.     lf.lfCharSet = GetTextCharset(hdc);
  39.     if(EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc, (LPARAM)(LPSTR)fontname, 0))
  40.     {
  41.         lf.lfCharSet = OEM_CHARSET;
  42.         if(EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc, (LPARAM)(LPSTR)fontname, 0))
  43.         {
  44.             lf.lfCharSet = DEFAULT_CHARSET;
  45.             EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc, (LPARAM)(LPSTR)fontname, 0);
  46.         }
  47.     }
  48.     
  49.     pt.x = 0;
  50.     pt.y = GetDeviceCaps(hdc, LOGPIXELSY) * fontsize / 72;
  51.     DPtoLP(hdc, &pt, 1);
  52.     lf.lfHeight = -pt.y;
  53.     
  54.     ReleaseDC(NULL, hdc);
  55.     
  56.     lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
  57.     lf.lfWeight = weight;
  58.     lf.lfItalic = (BYTE)italic;
  59.     lf.lfUnderline = 0;
  60.     lf.lfStrikeOut = 0;
  61.     //lf.lfCharSet = ;
  62.     lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
  63.     lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  64.     lf.lfQuality = DEFAULT_QUALITY;
  65.     lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
  66.     strcpy(lf.lfFaceName, fontname);
  67.     
  68.     return CreateFontIndirect(&lf);
  69. }
  70.  
  71. /*-------------------------------------------
  72.  パス名にファイル名をつける
  73. ---------------------------------------------*/
  74. void add_title(char *path, char *title)
  75. {
  76.     char *p;
  77.     
  78.     p = path;
  79.  
  80.     if(*title && *(title + 1) == ':') ;
  81.     else if(*title == '\\')
  82.     {
  83.         if(*p && *(p + 1) == ':') p += 2;
  84.     }
  85.     else
  86.     {
  87.         while(*p)
  88.         {
  89.             if((*p == '\\' || *p == '/') && *(p + 1) == 0)
  90.             {
  91.                 break;
  92.             }
  93.             p = CharNext(p);
  94.         }
  95.         *p++ = '\\';
  96.     }
  97.     while(*title) *p++ = *title++;
  98.     *p = 0;
  99. }
  100.  
  101. /*-------------------------------------------
  102.  パス名からファイル名をとりのぞく
  103. ---------------------------------------------*/
  104. void del_title(char *path)
  105. {
  106.     char *p, *ep;
  107.  
  108.     p = ep = path;
  109.     while(*p)
  110.     {
  111.         if(*p == '\\' || *p == '/')
  112.         {
  113.             if(p > path && *(p - 1) == ':') ep = p + 1;
  114.             else ep = p;
  115.         }
  116.         p = CharNext(p);
  117.     }
  118.     *ep = 0;
  119. }
  120.  
  121. /*------------------------------------------------
  122.     カンマで区切られた文字列を取り出す
  123. --------------------------------------------------*/
  124. void parse(char *dst, char *src, int n)
  125. {
  126.     char *dp;
  127.     int i;
  128.  
  129.     for(i = 0; i < n; i++)
  130.     {
  131.         while(*src && *src != ',') src++;
  132.         if(*src == ',') src++;
  133.     }
  134.     if(*src == 0) 
  135.     {
  136.         *dst = 0; return;
  137.     }
  138.     
  139.     while(*src == ' ') src++;
  140.     
  141.     dp = dst;
  142.     while(*src && *src != ',') *dst++ = *src++;
  143.     *dst = 0;
  144.     
  145.     while(dst != dp)
  146.     {
  147.         dst--;
  148.         if(*dst == ' ') *dst = 0;
  149.         else break;
  150.     }
  151. }
  152.  
  153. /*-------------------------------------------
  154.   returns a resource string
  155. ---------------------------------------------*/
  156. char* MyString(UINT id)
  157. {
  158.     static char buf[80];
  159.     
  160.     if(LoadString(hmod, id, buf, 80) == 0)
  161.         buf[0] = 0;
  162.     
  163.     return buf;
  164. }
  165.  
  166. char mykey[] = "Software\\Kazubon\\TClock";
  167.  
  168. /*------------------------------------------------
  169.  自分のレジストリから文字列を得る
  170. --------------------------------------------------*/
  171. int GetMyRegStr(char* section, char* entry, char* val, char* defval)
  172. {
  173.     char keystr[80];
  174.     HKEY hkey;
  175.     DWORD regtype;
  176.     DWORD size;
  177.     BOOL b;
  178.     int r;
  179.     
  180.     strcpy(keystr, mykey);
  181.     if(section && *section)
  182.     {
  183.         strcat(keystr, "\\"); strcat(keystr, section);
  184.     }
  185.     b = FALSE;
  186.     if(RegOpenKey(HKEY_CURRENT_USER, keystr, &hkey) == 0)
  187.     {
  188.         size = 1024;
  189.         if(RegQueryValueEx(hkey, entry, 0, ®type,
  190.             (LPBYTE)val, &size) == 0)
  191.         {
  192.             if(size == 0) *val = 0;
  193.             r = size;
  194.             b = TRUE;
  195.         }
  196.         RegCloseKey(hkey);
  197.     }
  198.     if(b == FALSE)
  199.     {
  200.         strcpy(val, defval);
  201.         r = strlen(defval);
  202.     }
  203.     return r;
  204. }
  205.  
  206. /*------------------------------------------------
  207.  自分のレジストリからLONG値を得る
  208. --------------------------------------------------*/
  209. LONG GetMyRegLong(char* section, char* entry, LONG defval)
  210. {
  211.     char keystr[80];
  212.     HKEY hkey;
  213.     DWORD regtype;
  214.     DWORD size;
  215.     BOOL b;
  216.     LONG r;
  217.  
  218.     strcpy(keystr, mykey);
  219.     if(section && *section)
  220.     {
  221.         strcat(keystr, "\\"); strcat(keystr, section);
  222.     }
  223.     b = FALSE;
  224.     if(RegOpenKey(HKEY_CURRENT_USER, keystr, &hkey) == 0)
  225.     {
  226.         size = 4;
  227.         if(RegQueryValueEx(hkey, entry, 0, ®type,
  228.             (LPBYTE)&r, &size) == 0)
  229.         {
  230.             if(size == 4) b = TRUE;
  231.         }
  232.         RegCloseKey(hkey);
  233.     }
  234.     if(b == FALSE) r = defval;
  235.     return r;
  236. }
  237.  
  238. /*------------------------------------------------
  239.  レジストリから文字列を得る
  240. --------------------------------------------------*/
  241. int GetRegStr(HKEY rootkey, char*subkey, char* entry,
  242.         char* val, char* defval)
  243. {
  244.     HKEY hkey;
  245.     DWORD regtype;
  246.     DWORD size;
  247.     BOOL b;
  248.     int r;
  249.     
  250.     b = FALSE;
  251.     if(RegOpenKey(rootkey, subkey, &hkey) == 0)
  252.     {
  253.         size = 1024;
  254.         if(RegQueryValueEx(hkey, entry, 0, ®type,
  255.             (LPBYTE)val, &size) == 0)
  256.         {
  257.             if(size == 0) *val = 0;
  258.             b = TRUE;
  259.         }
  260.         RegCloseKey(hkey);
  261.     }
  262.     if(b == FALSE)
  263.     {
  264.         strcpy(val, defval);
  265.         r = strlen(defval);
  266.     }
  267.     return r;
  268. }
  269.  
  270. /*-------------------------------------------
  271.  レジストリに文字列を書き込む
  272. ---------------------------------------------*/
  273. BOOL SetMyRegStr(char* subkey, char* entry, char* val)
  274. {
  275.     HKEY hkey;
  276.     BOOL r;
  277.     char key[80];
  278.     
  279.     strcpy(key, mykey);
  280.     if(*subkey)
  281.     {
  282.         strcat(key, "\\"); strcat(key, subkey);
  283.     }
  284.     r = FALSE;
  285.     if(RegCreateKey(HKEY_CURRENT_USER, key, &hkey) == 0)
  286.     {
  287.         if(RegSetValueEx(hkey, entry, 0, REG_SZ,
  288.             (CONST BYTE*)val, strlen(val)) == 0)
  289.         {
  290.             r = TRUE;
  291.         }
  292.         RegCloseKey(hkey);
  293.     }
  294.     return r;
  295. }
  296.  
  297. /*-------------------------------------------
  298.  レジストリにDWORD値を書き込む
  299. ---------------------------------------------*/
  300. BOOL SetMyRegLong(char* subkey, char* entry, DWORD val)
  301. {
  302.     HKEY hkey;
  303.     BOOL r;
  304.     char key[80];
  305.     
  306.     strcpy(key, mykey);
  307.     if(*subkey)
  308.     {
  309.         strcat(key, "\\"); strcat(key, subkey);
  310.     }
  311.     r = FALSE;
  312.     if(RegCreateKey(HKEY_CURRENT_USER, key, &hkey) == 0)
  313.     {
  314.         if(RegSetValueEx(hkey, entry, 0, REG_DWORD,
  315.             (CONST BYTE*)&val, 4) == 0)
  316.         {
  317.             r = TRUE;
  318.         }
  319.         RegCloseKey(hkey);
  320.     }
  321.     return r;
  322. }
  323.  
  324. /*------------------------------------------------
  325.  デバッグ用
  326. --------------------------------------------------*/
  327. void WriteDebug(LPSTR s)
  328. {
  329.     HFILE hf;
  330.     char fname[MAX_PATH], title[] = "DEBUG.TXT";
  331.  
  332.     GetModuleFileName(hmod, fname, MAX_PATH);
  333.     del_title(fname);
  334.     add_title(fname, title);
  335.     hf = _lopen(fname, OF_WRITE);
  336.     if(hf == HFILE_ERROR) hf = _lcreat(fname, 0);
  337.     if(hf == HFILE_ERROR) return;
  338.     _llseek(hf, 0, 2);
  339.     _lwrite(hf, s, lstrlen(s));
  340.     _lwrite(hf, "\x0d\x0a", 2);
  341.     _lclose(hf);
  342. }
  343.